from flask import Flask, jsonify, request

app = Flask(__name__)


@app.route('/books', methods=['GET'])
def get_books():
    # 读取数据库里的所有图书，此处使用模拟数据进行测试
    books = [
        {"id": 1, "title": "西游记", "author": "吴承恩"},
        {"id": 2, "title": "三国演义", "author": "罗贯中"},
        {"id": 3, "title": "水浒传", "author": "施耐庵"},
        {"id": 4, "title": "红楼梦", "author": "曹雪芹"}
    ]

    return jsonify(books)


@app.route('/books/<int:id>', methods=['GET'])
def get_book_by_id(id):
    # 从数据库里查找指定图书，此处使用模拟数据进行查找
    books = [
        {"id": 1, "title": "西游记", "author": "吴承恩"},
        {"id": 2, "title": "三国演义", "author": "罗贯中"},
        {"id": 3, "title": "水浒传", "author": "施耐庵"},
        {"id": 4, "title": "红楼梦", "author": "曹雪芹"}
    ]
    book = next((b for b in books if b["id"] == id), None)
    # 如果找到了，返回JSON格式数据
    if book:
        return jsonify(book)
    else:  # 如果没有找到，返回错误信息和404状态码
        return jsonify({"message": "未找到"}), 404


@app.route('/books', methods=['POST'])
def add_book():
    # 从请求对象中获取JSON数据
    data = request.json
    # 根据数据构造对象并添加到数据库中，这里模拟操作，直接打印出来
    print(data)
    # 返回成功信息
    return jsonify({"message": "添加成功"}), 201


@app.route('/books/<int:id>', methods=['PUT'])
def update_book(id):
    # 从请求对象中获取JSON数据
    data = request.json
    # 从数据库里查找要修改的图书是否存在，此处使用模拟数据进行查找
    books = [
        ...
    ]
    book = next((b for b in books if b["id"] == id), None)
    # 如果找到了，进行更新，并进行数据库保存，此处采用打印模拟
    if book:
        book.update(data)
        print(book)
        return jsonify({"message": "修改成功"}), 200
    else:  # 要修改的图书不存在，返回404错误和信息
        return jsonify({"message": "未找到"}), 404


@app.route('/books/<int:id>', methods=['DELETE'])
def delete_book(id):
    # 从数据库里查找要删除的图书是否存在，此处使用模拟数据进行查找
    books = [
        ...
    ]
    book = next((b for b in books if b["id"] == id), None)
    # 如果找到了，进行数据库的删除操作，此处打印模拟
    if book:
        print("模拟数据库删除...删除完成")
        return '', 204  # 删除成功，返回204，不需要信息
    else:  # 要删除的图书不存在，返回404错误和信息
        return jsonify({"message": "未找到"}), 404


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)
